AnyMath 文档
Notebook

参数估计

如果我们考虑根据模型的数据创建控制对象的模型,那么通常有三种方法:
白盒模型是我们知道系统所有基本动态的模型。
相反,黑盒模型意味着我们根本不知道动态。
这个例子考察了中间灰盒方法,当我们知道模型的结构,但我们缺少一些参数。
缺失的参数可以根据实验数据进行选择。 这是一个相当复杂的算法,但由于脚本和模型的协作,即使是如此困难的任务也可以在代码中实现。

为了便于在其他项目中重用算法,代码被代码单元的掩码隐藏。 掩码仅在代码编辑器中起作用,因此社区中没有完整的功能。 因此,下面的屏蔽代码已被替换为参数_estimation的屏幕截图。ngscript文件。

从表加载数据
In [ ]:
using DataFrames, CSV;
image.png
image.png
In [ ]:
df_in = DataFrame(time=exp_time_data, value=exp_in_data)
df_in = Float64.(df_in);
wa_in = WorkspaceArray(string(rand()), df_in)
Out[0]:
WorkspaceArray{Float64}("0.13840788610457466")

在本例中,控制对象是直流电机。 模型包含引擎文档中的所有已知参数。 但是在文档中没有给出摩擦,所以现在在粘性摩擦和滑动摩擦系数块中有近似值。

下一个单元格运行模型进行模拟,以确保模型的结果与实验数据相去甚远。

实验数据与模型数据的比较
image.png
连接库进行评估
In [ ]:
using DataFrames
try
    using NLopt
catch
    Pkg.add(["NLopt"])
    using NLopt
end
try
    using Interpolations
catch
    Pkg.add(["Interpolations"])
    using Interpolations
end
Оценка.png
res.png

结果:

经过30次迭代,我们选择了以下参数:

Результаты оценки:
b = 0.024429360665833955
c = 1.4808238712308082

我们对结果非常满意。

为了改进结果,您可以对初始假设,优化设置进行实验,并将各种输入数据提交给实验台。